/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.skatiger.jrove.spring.form.renderer;

import java.io.IOException;

import org.skatiger.jrove.ResponseWriter;
import org.skatiger.jrove.ViewContext;
import org.skatiger.jrove.component.JroveAttr;
import org.skatiger.jrove.component.UIComponent;
import org.skatiger.jrove.renderer.Html;
import org.skatiger.jrove.renderer.RendererUtils;

public class FormRenderer extends AbstractFormElementRenderer {

    public static final String METHOD_SUPPORTED_PROPERTY_NAME = "methodBrowserSupported";
    public static final String METHOD_PARAM_PROPERTY_NAME = "methodParam";
    public static final String DECLARE_METHOD_PROPERTY_NAME = "declareMethod";

    @Override
    public void encodeBegin(ViewContext context, UIComponent component)
            throws IOException {
        ResponseWriter writer = context.getResponseWriter();

        writer.startElement(Html.FORM_ELEM, component);
        renderId(context, component);
        //build calculate
        String action = calculateUrl(context, component,
                JroveAttr.ACTION_ATTR);
        writer.writeAttribute(Html.ACTION_ATTR, action,
                JroveAttr.ACTION_ATTR);
        
        RendererUtils.renderHtmlStandardAttributes(writer, component,
                Html.FORM_ELEM_OPTIONAL_ATTRIBUTES);

        boolean support = (Boolean) component.getAttributes().get(
                METHOD_SUPPORTED_PROPERTY_NAME);
        if (!support) {
            renderUnsupportedMethodHiddenElement(context, component);
        }// Expose the form object name for nested tags...

    }

    public static void renderUnsupportedMethodHiddenElement(
            ViewContext context, UIComponent component) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        writer.startElement(Html.INPUT_ELEM, component);
        writer.writeAttribute(Html.TYPE_ATTR, Html.INPUT_TYPE_HIDDEN,
                Html.TYPE_ATTR);
        //write methodParam
        String methodParam = (String) component.getAttributes().get(
                METHOD_PARAM_PROPERTY_NAME);
        writer.writeAttribute(Html.NAME_ATTR, methodParam, Html.NAME_ATTR);

        // write method
        String method = (String) component.getAttributes().get(
                DECLARE_METHOD_PROPERTY_NAME);
        writer.writeAttribute(Html.VALUE_ATTR, method, Html.VALUE_ATTR);
        writer.endElement(Html.INPUT_ELEM);
    }

    @Override
    public void encodeEnd(ViewContext context, UIComponent component)
            throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        writer.endElement(Html.FORM_ELEM);
    }
}
